namespace ConsoleApp1;

public class Lambda
{
    //若要创建 Lambda 表达式，需要在 Lambda 运算符左侧指定输入参数（如果有），然后在另一侧输入表达式或语句块。
    // 
    // 任何 Lambda 表达式都可以转换为委托类型。 其参数的类型和返回值定义了 Lambda 表达式可转换成的委托类型。 如果 lambda 表达式不返回值，则可以将其转换为 Action 委托类型之一；
    // 否则，可将其转换为 Func 委托类型之一。 例如，有 2 个参数且不返回值的 Lambda 表达式可转换为 Action<T1,T2> 委托。
    // 有 1 个参数且不返回值的 Lambda 表达式可转换为 Func<T,TResult> 委托。 以下示例中，Lambda 表达式 x => x * x（指定名为 x 的参数并返回 x 平方值）将分配给委托类型的变量：
    public void t1()
    {
        Func<int, int> square = x => x * x;
        Console.WriteLine(square(5));
    }

    public void expressionTree()
    {
        System.Linq.Expressions.Expression<Func<int, int>> e = x => x * x;
        Console.WriteLine(e);
    }

    //在任何需要委托类型或表达式树实例的代码中使用 Lambda 表达式。 一个示例是 Task.Run(Action) 方法的参数，用于传递应在后台执行的代码。 用 C# 编写 LINQ 时，还可以使用 lambda 表达式，如下例所示：
    public static void lambda()
    {
        int[] numbers = { 2, 3, 4, 5 };
        var squaredNumbers = numbers.Select(x => x * x);
        Console.WriteLine(string.Join(" ", squaredNumbers));
    }

    //表达式 lambda 的主体可以包含方法调用。 不过，若要创建在 .NET 公共语言运行时 (CLR) 的上下文之外（如在 SQL Server 中）计算的表达式树，则不得在 Lambda 表达式中使用方法调用。 在 .NET 公共语言运行时 (CLR) 上下文之外，方法没有任何意义。
    public void action()
    {
        Action<string> greet = name =>
        {
            string greeting = $"Hello {name}!";
            Console.WriteLine(greeting);
        };
        greet("World");
    }
}